package com.ygxsk.carhome.helper;

import android.annotation.SuppressLint;
import android.app.Application;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.text.TextUtils;
import android.widget.RemoteViews;

import androidx.core.app.NotificationCompat;

import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.Utils;
import com.blankj.utilcode.util.VibrateUtils;
import com.taobao.accs.ACCSClient;
import com.taobao.accs.AccsClientConfig;
import com.taobao.agoo.TaobaoRegister;
import com.tencent.mmkv.MMKV;
import com.umeng.analytics.MobclickAgent;
import com.umeng.commonsdk.UMConfigure;
import com.umeng.commonsdk.utils.UMUtils;
import com.umeng.message.IUmengCallback;
import com.umeng.message.IUmengRegisterCallback;
import com.umeng.message.MsgConstant;
import com.umeng.message.PushAgent;
import com.umeng.message.UmengMessageHandler;
import com.umeng.message.UmengNotificationClickHandler;
import com.umeng.message.entity.UMessage;
import com.umeng.socialize.PlatformConfig;
import com.ygxsk.carhome.R;
import com.ygxsk.carhome.badge.BadgeUtils;
import com.ygxsk.carhome.constant.ConstantSign;
import com.ygxsk.carhome.constant.ExtraKey;
import com.ygxsk.carhome.constant.ExtraValue;
import com.ygxsk.carhome.sys.Session;
import com.ygxsk.carhome.ui.SplashActivity;
import com.ygxsk.carhome.ui.home.HomeMainFragmentActivity;
import com.ygxsk.carhome.utils.PMUtils;
import com.ygxsk.carhome.utils.TimeUtilSer;
import com.ygxsk.integrated.retrofit.Parameterkey;

import org.android.agoo.huawei.HuaWeiRegister;
import org.android.agoo.oppo.OppoRegister;
import org.android.agoo.vivo.VivoRegister;
import org.android.agoo.xiaomi.MiPushRegistar;

import java.util.concurrent.TimeUnit;

import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import io.reactivex.rxjava3.core.ObservableOnSubscribe;
import io.reactivex.rxjava3.functions.Consumer;

/**
 * PushSDK集成帮助类,
 */
public class PushHelper {


    /**
     * 播放本地的默认的声音文件
     */
//    private static final int PLAYMUSIC_BY_DEFAULT = 2;
    /**
     * 播放的是 通过链接 的在线的播放
     */
//    private static final int PLAYMUSIC_BY_LINKONLINE = 1;

    /**
     * 播放的是 通过指定的文件名 的声音文件播放我本地的raw 或者 accest 文件指定的 音频文件。
     */
//    private static final int PLAYMUSIC_BY_GIVENFILENAME = 0;
    //private static final String TAG = com.umeng.message.demo.helper.PushHelper.class.getSimpleName();

    /**
     * 服务内的绑定对象iBinder
     */
//    private static BinderMusicInterface binderMusicInterface;

//     直接绑定推送消息服务的连接
//    private static class MyConnPlayMusic implements ServiceConnection {
//        @Override
//        public void onServiceConnected(ComponentName name, IBinder service) {
//            binderMusicInterface = (BinderMusicInterface) service;
//            LogUtils.d("itchen---PushHelper之中的---MyConnPlayMusic-----onServiceConnected---链接成功了");
//        }
//
//        @Override
//        public void onServiceDisconnected(ComponentName name) {
////            LogUtils.d("itchen---MyConnPlayMusic---onServiceDisconnected");
//        }
//    }


    /**
     * 预初始化，已添加子进程中初始化sdk。
     * 使用场景：用户未同意隐私政策协议授权时，延迟初始化
     *
     * @param context 应用上下文
     */
    public static void preInit(Context context) {

        try {
            //解决推送消息显示乱码的问题
            AccsClientConfig.Builder builder = new AccsClientConfig.Builder();
            builder.setAppKey(context.getString(R.string.key_umeng) + PushConstants.APP_KEY);
            builder.setAppSecret(PushConstants.MESSAGE_SECRET);
            builder.setTag(AccsClientConfig.DEFAULT_CONFIGTAG);
            ACCSClient.init(context, builder.build());

            TaobaoRegister.setAccsConfigTag(context, AccsClientConfig.DEFAULT_CONFIGTAG);

        } catch (Exception e) {
            e.printStackTrace();
        }

        UMConfigure.preInit(context, PushConstants.APP_KEY, PushConstants.CHANNEL);

        if (!isMainProcess(context)) {
            init(context);
        }

    }

//    /**
//     * 启动服务使用不带携带参数的方式启动服务
//     *
//     * @param _context
//     */
//    public static void startServiceWithNoBundle(Context _context) {
//
//        //========================================================================================================================
//        MyConnPlayMusic myConnPlayMusic = new MyConnPlayMusic();
//
//        //判断服务是否活着
//        if (!ServiceUtils.isServiceRunning(MusicPlayService.class)) {
//
//            //使用绑定的来启动服务
//            Intent intentBindService = new Intent();
//            intentBindService.setClass(_context, MusicPlayService.class);
//
//            if (_context != null) {
//
////                LogUtils.d("itchen---MusicPlayService--服务 在 PushHelper 之中绑定 启动它");
//                //这里需要重新bindservice
//                if (myConnPlayMusic != null) {
//                    _context.bindService(intentBindService, myConnPlayMusic, Context.BIND_AUTO_CREATE);
//                }
//
//            }
//
//        } else {
//
//            //消息推送已经来了，我播放一遍
//            //判断是否锁屏，锁屏就播放我自己的。
//            Intent intentStartService = new Intent();
//            intentStartService.setClass(_context, MusicPlayService.class);
//
////            LogUtils.d("itchen---MusicPlayService--服务是 活着的，PushHelper-之中调用 startServiceWithNoBundle 打开它");
//
//            //如果 设备保养的服务 没有起来，那么就起来
//            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//
//                if (_context != null) {
//                    _context.startForegroundService(intentStartService);
//                }
//
//            } else {
//                ServiceUtils.startService(intentStartService);
//            }
//
//        }
//
//        //========================================================================================================================
//
//    }

    /**
     * 初始化。
     * 场景：用户已同意隐私政策协议授权时
     *
     * @param context 应用上下文
     */
    public static void init(Context context) {

        //初始化组件化基础库, 统计SDK/推送SDK/分享SDK都必须调用此初始化接口
        /**
         * 初始化common库
         * 参数1:上下文，不能为空
         * 参数2:友盟 app key
         * 参数3:友盟 channel
         * 参数4:设备类型，UMConfigure.DEVICE_TYPE_PHONE为手机、UMConfigure.DEVICE_TYPE_BOX为盒子，默认为手机
         * 参数5:Push推送业务的secret
         */

        //UMConfigure.init(this, "替换为Appkey,服务后台位置：应用管理 -> 应用信息 -> Appkey",//
        // "Umeng",//
        // UMConfigure.DEVICE_TYPE_PHONE, //
        // "替换为秘钥信息,//
        // 服务后台位置：应用管理 -> 应用信息 -> Umeng Message Secret");//

        //获取消息推送代理示例 2021年10月23日14:57:39 真实的代码备份。
//        UMConfigure.init(this, //
//                "5dfdcd6c570df3ca2d00002a", //在移动统计的看板应用信息能看见
//                "Umeng", //
//                UMConfigure.DEVICE_TYPE_PHONE, //
//                "1886b4d948f965695aa76468f29e5607");//在推送看板应用信息能看见 Umeng Message Secret
        //开启ShareSDK debug模式，方便定位错误，具体错误检查方式可以查看http://dev.umeng.com/social/android/quick-integration的报错必看，正式发布，请关闭该模式
        //Config.DEBUG = true;


        // 在此处调用基础组件包提供的初始化函数 相应信息可在应用管理 -> 应用信息 中找到 http://message.umeng.com/list/apps
        // 参数一：当前上下文context；
        // 参数二：应用申请的Appkey；
        // 参数三：渠道名称；
        // 参数四：设备类型，必须参数，传参数为UMConfigure.DEVICE_TYPE_PHONE则表示手机；传参数为UMConfigure.DEVICE_TYPE_BOX则表示盒子；默认为手机；
        // 参数五：Push推送业务的secret 填充Umeng Message Secret对应信息
        UMConfigure.init(//
                context,//
                PushConstants.APP_KEY,//
                PushConstants.CHANNEL,//
                UMConfigure.DEVICE_TYPE_PHONE,//
                PushConstants.MESSAGE_SECRET);//

        //设置微信分享能力
        PlatformConfig.setWeixin(PushConstants.WEIXIN_APPID, PushConstants.MESSAGE_SECRET);
        PlatformConfig.setWXFileProvider("com.tencent.sample2.fileprovider");

        //如下行代码 之中的ument-crash 我并没有集成：
        //集成umeng-crash-vx.x.x.aar，则需要关闭原有统计SDK异常捕获功能
        MobclickAgent.setCatchUncaughtExceptions(false);

        //-------------------------------------------------------------------------------------------
        //获取消息推送实例
        final PushAgent pushAgent = PushAgent.getInstance(context);

        pushAdvancedFunction(context);

        //注册推送服务，每次调用register方法都会回调该接口
        pushAgent.register(new IUmengRegisterCallback() {

            @Override
            public void onSuccess(String deviceToken) {
                //注册成功会返回deviceToken deviceToken是推送消息的唯一标志
                //注册成功会返回device token
                //MMKV.defaultMMKV().encode("deviceToken", deviceToken);
                MMKV.defaultMMKV().encode(ConstantSign.UMENG_PUSHAGENT_REGISTER_DEVICETOKEN, deviceToken);
                //2019年04月27日发现覆盖安装token不变，但是卸载掉重新安装会有问题
                LogUtils.d("itchen--PushHelper类--mPushAgent---注册成功--deviceToken-->" + deviceToken);
                //AgV4v_rAlZ37cFD6S_sankbvRbI-pg1h46JjDLttmKxg
                //itchen----mPushAgent---注册成功--deviceToken-->AvGgkdVYLgjuH6e1gElN7bCfT2frOiGaTpmGZrLLxGQ8
                //itchen----mPushAgent---注册成功--deviceToken-->AibIfOA6do7PDx3Nf2BLV_QOuUb6-dMc8uLq_ItI-h47

                //2021年10月23日16:42:12 的日志内容。
                //itchen----mPushAgent---注册成功--deviceToken-->AhZrzebqx2BtZSI9fic-LLNJ3EO_osHq0yBlNqY5R-GH

            }

            @Override
            public void onFailure(String errCode, String errDesc) {

                //Log.e(TAG, "register failure：--> " + "code:" + errCode + ",desc:" + errDesc);
//                LogUtils.d("itchen---->register failure：--> " + "code:" + errCode + ",desc:" + errDesc);
                LogUtils.d("itchen--PushHelper类--itchen_deviceToken---注册失败--fail-->" + errCode + "-->" + errDesc);
                //itchen--itchen_deviceToken---注册失败--fail-->-11-->accs bindapp error!

            }

        });

        //若调用关闭推送后，想要再次开启推送，则需要调用以下代码
        pushAgent.enable(new IUmengCallback() {
            @Override
            public void onSuccess() {
                //2019年04月27日发现覆盖安装token不变，但是卸载掉重新安装会有问题
                LogUtils.d("itchen_mPushAgent设置推送---enable-->推送成功");
            }

            @Override
            public void onFailure(String s, String s1) {
                LogUtils.d("itchen_mPushAgent---设置推送---onFailure-->推送失败");
            }
        });


        if (isMainProcess(context)) {

            LogUtils.d("itchen---注册厂商通道 在主线程  -即将执行注册操作");

            registerDeviceChannel(context);

        } else {
            LogUtils.d("itchen---注册厂商通道 不在主线程之内");
        }

        //用户【同意】之后才添加 统计功能；
        //设置友盟统计的功能
        MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO);

    }

    /**
     * 注册设备推送通道（小米、华为等设备的推送）,这个需要在应用市场申请之后才可以用；
     *
     * @param context 应用上下文
     */
    private static void registerDeviceChannel(Context context) {

//        //华为，注意华为通道的初始化参数在minifest中配置
        HuaWeiRegister.register((Application) context.getApplicationContext());
//        //小米通道，填写您在小米后台APP对应的xiaomi id和key
//        MiPushRegistar.register(context, PushConstants.MI_ID, PushConstants.MI_KEY, false);
        MiPushRegistar.register(context, PushConstants.MI_ID, PushConstants.MI_KEY);
//        //魅族，填写您在魅族后台APP对应的app id和key
//        //MeizuRegister.register(context, PushConstants.MEI_ZU_ID, PushConstants.MEI_ZU_KEY);
//        //OPPO，填写您在OPPO后台APP对应的app key和secret
//        //2022-8-15 10:22:07因为OPPO会对com.heytap健康监测安装包做判断；
        OppoRegister.register(context, PushConstants.OPPO_KEY, PushConstants.OPPO_SECRET);
        //vivo，注意vivo通道的初始化参数在minifest中配置
        VivoRegister.register(context);

    }

    /**
     * 是否运行在主进程
     *
     * @param context 应用上下文
     * @return true: 主进程；false: 子进程
     */
    public static boolean isMainProcess(Context context) {
        return UMUtils.isMainProgress(context);
    }

    //推送高级功能集成说明
    private static void pushAdvancedFunction(Context context) {

        PushAgent pushAgent = PushAgent.getInstance(context);

        //测试声音由本地控制
        //mPushAgent.setNotificationPlaySound(MsgConstant.NOTIFICATION_PLAY_SDK_ENABLE);//开启SDK声音
        //public void setNoDisturbMode(int startHour, int startMinute, int endHour, int endMinute)
        //pushAgent.setNoDisturbMode(12, 0, 14, 0);//没有免打扰限制
        pushAgent.setNoDisturbMode(0, 0, 0, 0);//没有免打扰限制:是关闭免打扰模式；任何时候都有动作；
        //默认情况下，同一台设备在1分钟内收到同一个应用的多条通知时，不会重复提醒,可以通过如下方法来设置冷却时间：
        //默认情况下，同一台设备在1分钟内收到同一个应用的多条通知时，不会重复提醒，可以通过如下方法来设置冷却时间：
        pushAgent.setMuteDurationSeconds(5);//声音冷却时间是5秒
        //设置通知栏显示通知的最大个数（0～10），0：标识不限制个数
        //可以设置最多显示通知的条数，当显示数目大于设置值时，若再有新通知到达，会移除一条最早的通知
        pushAgent.setDisplayNotificationNumber(0);

        //服务端控制声音
        //如果设置了 声音是不发出推送声音的，那末就是关闭声音的。
        if (MMKV.defaultMMKV().decodeBool(ConstantSign.P_SWITCHBUTTONAPPSOUND)) {
            //开启声音 第一行代码是使用SDK系统自己的推送声音。
            pushAgent.setNotificationPlaySound(MsgConstant.NOTIFICATION_PLAY_SDK_ENABLE);
            //mPushAgent.setNotificationPlaySound(MsgConstant.NOTIFICATION_PLAY_SERVER);//声音由服务端控制,如果没有就是系统默认.
        } else {
            pushAgent.setNotificationPlaySound(MsgConstant.NOTIFICATION_PLAY_SDK_DISABLE);
        }

        //如果设置了打开震动，那么就是震动可用的
        if (MMKV.defaultMMKV().decodeBool(ConstantSign.P_SWITCHBUTTONAPPSHOCK)) {
            pushAgent.setNotificationPlayVibrate(MsgConstant.NOTIFICATION_PLAY_SDK_ENABLE);
        } else {
            //如果设置关闭了震动，那么震动就是不可用的
            pushAgent.setNotificationPlayVibrate(MsgConstant.NOTIFICATION_PLAY_SDK_DISABLE);
        }


        //pushAgent.setNotificationPlaySound(MsgConstant.NOTIFICATION_PLAY_SERVER);
        //客户端允许呼吸灯点亮
        pushAgent.setNotificationPlayLights(MsgConstant.NOTIFICATION_PLAY_SDK_ENABLE);
        //客户端禁止振动
        //pushAgent.setNotificationPlayVibrate(MsgConstant.NOTIFICATIONPLAYSDKDISABLE);
        //客户端允许震动
        //pushAgent.setNotificationPlayVibrate(MsgConstant.NOTIFICATION_PLAY_SDK_ENABLE);

        //这里是我自己写的代码
        //pushAgent.setNotificationPlaySound(MsgConstant.NOTIFICATION_PLAY_SDK_ENABLE);//声音由服务端控制,如果没有就是系统默认.
        //pushAgent.setNotificationPlayLights(MsgConstant.NOTIFICATION_PLAY_SDK_ENABLE);//打开闪光灯
        //pushAgent.setNotificationPlayVibrate(MsgConstant.NOTIFICATION_PLAY_SDK_ENABLE);//打开震动提示

        //设置App处于前台时不显示通知
        //如果您的应用在前台，您可以设置不显示通知消息。
        // 默认情况下，应用在前台是显示通知的。开发者更改前台通知显示设置后，会根据更改生效。若希望前台时不显示通知，调用接口如下：
        //2021年10月25日10:05:02 设置在前台也显示通知。
        PushAgent.getInstance(context).setNotificationOnForeground(true);//

        //SDK默认是不检查集成配置文件的,对于 AndroidManifest 配置文件的检查工具，可以自行检查开发者的配置问题。
        //mPushAgent.setPushCheck(true);


        //推送消息处理
        UmengMessageHandler msgHandler = new UmengMessageHandler() {
            //消息推送的json
            /*{
        "agoo_msg_id": "f__-eE66E4IVjBwF&&uufa464168230636234110&&AhqQd4Bl_qt_ONO5OUu1RXgXHU94Ff3qli0B300B9KuJ&&11&&&&",
        "body": {
        "after_open": "go_app",
        "play_sound": "true",
        "text": "测试第三个内容消息测试第三个内容消息测试第三个内容消息测试第三个内容消息",
        "ticker": "测试第三个内容消息",
        "title": "测试第三个内容消息"
       },
      "display_type": "notification",
      "msg_id": "uufa464168230636234110"
}*/

            //友盟原始注释：自定义通知样式，此方法可以修改通知样式等
            @Override
            public Notification getNotification(Context context, UMessage uMessage) {

                //收到了消息，那么设置为true
                Session.get(context).setPushToMyMessage(true);
                //Session.get(context).setPushToMyMessageProce(true);

//                if (uMessage != null) {

//                  itchen---------getNotification---->{"display_type":"notification","body":{"title":"小米测试标题4",
//                  "play_sound":"true","text":"小米测试内容4","after_open":"go_app","ticker":"小米测试标题4"},
//                  "msg_id":"uustzy7170019164667810",
//                  "agoo_msg_id":"f__-dCSuS8Ld44MB&&uustzy7170019164667810&&AqDJ91BQyLQ7bttDTbZNrkh0ziNH7llH8qqyz3znLxrD&&11&&"}
//                    LogUtils.d("itchen---------getNotification---->" + uMessage.getRaw());
//                    {
//                            "agoo_msg_id": "f__-dCSzb5OBYdoB&&uuau174170019130988310&&AqDJ91BQyLQ7bttDTbZNrkh0ziNH7llH8qqyz3znLxrD&&10&&",
//                            "body": {
//                                "after_open": "go_app",
//                                "play_sound": "true",
//                                "text": "小米测试内容4",
//                                "ticker": "小米测试标题4",
//                                "title": "小米测试标题4"
//                            },
//                            "display_type": "notification",
//                            "msg_id": "uuau174170019130988310"
//                    }

                //电子档案消息：
//                    {
//                        "agoo_msg_id": "f__-c-wkmJFKvIIA&&uu3xlm7170114019432701&&AlrI8DWs-j-OlKWWr1FwlrQSsvNlifFYulMlKoVNaW0e&&11&&",
//                            "body": {
//                            "after_open": "go_custom",
//                                "custom": "MY_MESSAGE",
//                                "sound": "umeng_push_notification_default_sound",
//                                "text": "您有一条编号为【170104920536514941】合同需要签批，请及时通过处理。",
//                                "ticker": "电子签章经理提醒",
//                                "title": "电子签章经理提醒"
//                    },
//                            "display_type": "notification",
//                            "extra": {
//                            "open": "MY_MESSAGE"
//                    },
//                           "msg_id": "uu3xlm7170114019432701"
//                    }

//                    JSONObject jsonObject = uMessage.getRaw();
//
//                    try {
//
//                        String body = (String) jsonObject.get("body");
//                        // : 2023-11-17 11:03 测试消息过来的通知
//                        ToastUtils.showLong(body);
//
//                    } catch (JSONException e) {
//
//                        //解析报错打印报错日志：
//                        if (e != null) {
//                            LogUtils.d(ConstantSign.LOGCAT_NOMAL + "解析json报错信息->" + ConstantSign.LOGCAT_NOMAL + e.getLocalizedMessage());
//                        }
//
//                        //throw new RuntimeException(e);
//                    }


//                }
                //这里使用系统默认的通知内容
                //2021-6-24 16:39:55 通过观察日志发现 getNotification 的消息要早于  dealWithNotificationMessage 的消息。

                //点亮屏幕，如果屏幕之前是关着的，那么必须点亮
                Observable.just(0, 1)//
                        .subscribeOn(AndroidSchedulers.mainThread())//
                        .observeOn(AndroidSchedulers.mainThread())//
                        .subscribe(new Consumer<Integer>() {
                            @SuppressLint("MissingPermission")
                            @Override
                            public void accept(Integer integer) throws Exception {

                                if (integer == 0) {
                                    if (!PMUtils.isScreenOn(context)) {
                                        PMUtils.wakeAndUnlock(context);
                                    }
                                } else if (integer == 1) {
                                    //只要推送来了 必然震动
                                    VibrateUtils.vibrate(2000);
                                }

                            }
                        }, new Consumer<Throwable>() {
                            @Override
                            public void accept(Throwable throwable) throws Exception {
                                if (throwable != null) {
//                                    LogUtils.d("itchen---throwable 报错为->" + throwable.getLocalizedMessage());
                                }
                            }
                        });

                return getNotificationMySelf(context, uMessage, "umeng_push_notification_default_sound");
            }

            //友盟原始注释：处理通知栏消息
            @Override
            public void dealWithNotificationMessage(Context context, UMessage uMessage) {
                super.dealWithNotificationMessage(context, uMessage);

//                LogUtils.d("itchen----dealWithNotificationMessage receiver:" + uMessage.getRaw().toString());

//                if (uMessage != null) {

//                    LogUtils.d("itchen---------dealWithNotificationMessage---->" + uMessage.getRaw());
//                    itchen---------dealWithNotificationMessage---->{"display_type":"notification","body":{"title":"小米测试标题","play_sound":"true","text":"小米测试内容","after_open":"go_app","ticker":"小米测试标题"},"msg_id":"uu25dc4170018988775510","agoo_msg_id":"f__-dCTJIkdKALYB&&uu25dc4170018988775510&&AqDJ91BQyLQ7bttDTbZNrkh0ziNH7llH8qqyz3znLxrD&&10&&"}

                //直接上传日志信息
//                    if (context != null) {
//                        LogUtils.d("itchen---------context---->" + context.getClass().getName());
//                    }
//                }

                Observable.create(new ObservableOnSubscribe<Integer>() {
                            @Override
                            public void subscribe(@io.reactivex.rxjava3.annotations.NonNull ObservableEmitter<Integer> emitter) throws Throwable {
//                             LogUtils.d(ConstantApi.LOGCAT_NOMAL + "执行了-_session.getTotalNumber()->" + _session.getTotalNumber());
                                emitter.onNext(1);
                                emitter.onComplete();
                            }
                        }).debounce(1500, TimeUnit.MILLISECONDS)//以毫秒来计算
                        .subscribe(new Consumer<Integer>() {
                            @Override
                            public void accept(Integer integerValuePull) throws Throwable {
                                //执行一次添加一下，直到最后一个菜去发送数据
                                BadgeUtils.setCount(1, context);
                            }
                        });

                //--------------------------------------------------------------------------------------------------------------------------------------------------

            }

            //处理透传消息 官网注释：2021年10月23日15:13:02 itchenqi注释 这里我暂时没用到。
            @Override
            public void dealWithCustomMessage(Context context, UMessage msg) {
                super.dealWithCustomMessage(context, msg);
                LogUtils.d("itchen", "custom receiver:" + msg.getRaw().toString());
            }

        };

        //这个有版本限制 android8.0以上才可以
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        pushAgent.setMessageHandler(msgHandler);
//        }

        //推送消息点击处理
        UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler() {

             /*@Override
            public void handleMessage(Context context, UMessage uMessage) {
                super.handleMessage(context, uMessage);
                //亲自测试 需要点击才能进来
                LogUtils.d("itchen----执行handleMessage---消息--->" + uMessage.getRaw());
                {
         "body": {
        "activity": "com.dgj.propertysmart.ui.home.MfrMessageActivity",
        "after_open": "go_activity",
        "play_lights": "true",
        "play_sound": "true",
        "play_vibrate": "true",
        "sound": "repairorderreminder",
        "text": "测试荣耀V9内容",
        "ticker": "测试荣耀V9",
        "title": "测试荣耀V9"
        },
        "display_type": "notification",
        "msg_id": "uuv2ce9162312133347610"
           }
            }*/

            //自定义点击通知时的打开动作
            @Override
            public void dealWithCustomAction(Context context, UMessage uMessage) {
                //super.dealWithCustomAction(context, uMessage);

                //Session.get(context).setPushToMyMessage(true);
                //暂时用不到
                //Session.get(context).setPushToMyMessageProce(true);

                //1:要先判断app是否运行
                //2:是在前台或者后台运行
                if (uMessage != null) {
                    //----------------------------------------------------------------------------------------------------

//                    //2021年6月10日17:26:04。  应用活着的 不是通道的，就走这里
//                    LogUtils.d("itchen--点击通知栏-->携带友盟数据-uMessage.extra-->" + uMessage.extra);
//                    LogUtils.d("itchen--点击通知栏-->携带友盟数据-uMessage.extra-->" + uMessage.getRaw());
//                    LogUtils.d("itchen--点击通知栏-->携带友盟数据 body- custom  -->" + uMessage.custom);
//                    LogUtils.d("itchen--点击通知栏-->携带友盟数据 body- body  -->" + uMessage.sound);
//                    LogUtils.d("itchen--点击通知栏---->携带的 body-之中的- text->" + uMessage.text);
//                    LogUtils.d("itchen--点击通知栏---->携带的 body-之中的- title--->" + uMessage.title);

                    //----------------------------------------------------------------------------------------------------
                    //是不是要判断是厂商过来的：
                    //Session session = Session.get(Utils.getApp());
                    //session.setMapExtra(uMessage.extra);
                    //拆分的写法
                    //Map<String, String> mapExtra = uMessage.extra;
                    //String value = mapExtra.get("open");
                    //整合的写法:推送暂时不做2020年5月18日11:35:00 等做的时候放开
                    // methodToPush(context,uMessage.extra);
                    //仅仅做打开应用的操作
                    methodOpenApp(context);

                } else {
//                    LogUtils.d("itchen--点击通知栏-->消息通知为空-uMessage.extra-");
                }

            }

            @Override
            public void openActivity(Context context, UMessage msg) {
                super.openActivity(context, msg);
//                LogUtils.d("itchen", "click openActivity: " + msg.getRaw().toString());
            }

            @Override
            public void launchApp(Context context, UMessage msg) {
                super.launchApp(context, msg);
//                LogUtils.i("itchen", "click launchApp: " + msg.getRaw().toString());
            }

            @Override
            public void dismissNotification(Context context, UMessage msg) {
                super.dismissNotification(context, msg);
//                LogUtils.i("itchen", "click dismissNotification: " + msg.getRaw().toString());
            }
        };

        pushAgent.setNotificationClickHandler(notificationClickHandler);
    }

    /**
     * 早期仅仅做应用的打开消息
     */
    private static void methodOpenApp(Context mContext) {

        if (AppUtils.isAppForeground()) {//如果是前台运行那么，直接跳转页面。

            //什么前置条件操作？
            //携带参数内容
            Intent intentToMessage = new Intent();
            //跳转到【首页】并且跳转到【我的消息】。
            intentToMessage.setClass(mContext, HomeMainFragmentActivity.class);

            intentToMessage.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//必须携带吗？

            //携带一个跳转到消息选项卡的标识
            intentToMessage.putExtra(ExtraKey.EXTRA_LOGINKEY, ExtraValue.EXTRA_PUSHTOBULLETIN);

            mContext.startActivity(intentToMessage);

        } else {//如果是后台运行，那么重启app即可

            method_toSplash(mContext);//启动app-->进而启动消息内容


        }

    }

    /**
     * 正常的启动该app即可
     */
    private static void method_toSplash(Context context) {

        Intent intentTosplash = new Intent();

        intentTosplash.setClass(context, SplashActivity.class);
        intentTosplash.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

//        LogUtils.d("itchen--->执行到-->method_toSplash");
        context.startActivity(intentTosplash);

    }

    /**
     * 通知栏的方式 我自己自定义的。
     */
    private static Notification getNotificationMySelf(Context _context, UMessage _uMessage, String _soundFileName) {

        LogUtils.d("itchen---getNotificationMySelf---->" + "getNotificationMySelf");
        //2021年6月8日10:10:14 如果将来自定义通知栏就放开代码
        //如果发现是报修工单的类型，那末就使用 自定义的通知类型。
        //第一种方式：存在可用的文件
        Uri soundUri = Uri.parse("android.resource://com.ygxsk.carhome/raw/" + _soundFileName);
        //第二种方式：废弃不用的
        //Uri sound = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.repairorderreminder);
        LogUtils.d("itchen---sound---->" + soundUri);

        //---------------------------------------------------------------------------------------------------------
        //暂时关闭第一段代码---------------------------------------------------------------------------------------------------------------------------------------
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

            LogUtils.d(ConstantSign.LOGCAT_NOMAL + "设置消息--Build.VERSION.SDK_INT >= Build.VERSION_CODES.O");

            //原始代码
            //NotificationChannel channel = new NotificationChannel("Default", "Default_Channel", NotificationManager.IMPORTANCE_HIGH);
            NotificationChannel channel = new NotificationChannel("my_create", "my_create_channel", NotificationManager.IMPORTANCE_HIGH);
            channel.setSound(soundUri, Notification.AUDIO_ATTRIBUTES_DEFAULT);

            channel.enableLights(true);//设置闪光灯
            channel.enableVibration(true);//设置震动
            //channel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});

            NotificationManager notificationManager = (NotificationManager) _context.getSystemService(Context.NOTIFICATION_SERVICE);

            if (notificationManager != null) {
                notificationManager.createNotificationChannel(channel);
            }

        } else {
            LogUtils.d(ConstantSign.LOGCAT_NOMAL + "设置消息--Build.VERSION.SDK_INT <小于 Build.VERSION_CODES.O");
        }

        NotificationCompat.Builder builder = new NotificationCompat.Builder(_context, "my_create");
        //设置大图标
        builder.setLargeIcon(BitmapFactory.decodeResource(Utils.getApp().getResources(), R.mipmap.ic_launcher));

        // : 2023-04-23 14:47 设置小图标
        //设置小图标
        builder.setSmallIcon(R.drawable.umeng_push_notification_default_small_icon);

        RemoteViews myNotificationView = new RemoteViews(_context.getPackageName(), R.layout.notification_view);

        //设置推送时间： Map<String, String> mapExtra
        if (_uMessage.extra != null) {
//            String time = _uMessage.extra.get("pushTime");
            String time = _uMessage.extra.get(Parameterkey.pushTime);
            if (!TextUtils.isEmpty(time)) {
                myNotificationView.setTextViewText(R.id.notification_createtime, time);//取到时间
            } else {
                myNotificationView.setTextViewText(R.id.notification_createtime, TimeUtilSer.getNow());//没有取到时间，那么取值当前默认的
            }
        } else {
            myNotificationView.setTextViewText(R.id.notification_createtime, TimeUtilSer.getNow());//取到时间 当前的，不能让该值空着。
        }

        myNotificationView.setTextViewText(R.id.notification_title, _uMessage.title);
        //2021年10月28日14:34:56 文字太长让我改造了
        myNotificationView.setTextViewText(R.id.notification_text, _uMessage.text);

        builder.setContent(myNotificationView)//
                .setSmallIcon(R.mipmap.ic_launcher)//系统默认
                .setSound(soundUri)//提示音
                .setTicker(_uMessage.ticker)//
                .setAutoCancel(false);//不让自动取消留着

        //Notification curNotification = builder.build();

        //--------------------------------------------------------------------------------------------------------------------------------------
        //测试代码---正式代码删掉
        //ImageView imageView = myNotificationView.get
        //系统默认
        //myNotificationView.setImageViewBitmap(R.id.notification_large_icon1,//
        //BitmapUtil.drawableToBitamp(ContextCompat.getDrawable(Utils.getApp(), R.drawable.umeng_push_notification_default_large_icon)));
        //myNotificationView.setImageViewBitmap(R.id.notification_large_icon1, R.mipmap.ic_launcher);.
        //系统默认
        //myNotificationView.setImageViewResource(R.id.notification_small_icon, getSmallIconId(context, msg));
        //--------------------------------------------------------------------------------------------------------------------------------------

        return builder.build();

    }


    /**
     * 真实的播放声音的方法
     */
//    private static void method_playMusic(Context _context, int _playType, String _isUrlSoundFlag, String _soundUrl, String _soundFileName) {
//
//        //===========================================================================================================================================
//        //这里开始计时 等待3秒钟
//        //Observable.just(0)
//        Observable.timer(4000, TimeUnit.MILLISECONDS)
//                .subscribeOn(AndroidSchedulers.mainThread())//
//                .observeOn(AndroidSchedulers.mainThread())//
//                .subscribe(new Consumer<Long>() {
//                    @Override
//                    public void accept(Long integer) throws Exception {
//
////                        LogUtils.d("itchen----执行到了-method_playMusic--method_playMusic--method_playMusic--method_playMusic-Observable.timer---来播放 提示音");
//
//                        //======================================================================================================================
//                        if (ServiceUtils.isServiceRunning(MusicPlayService.class)) {
//
////                            LogUtils.d("itchen----> 服务是活着的 isServiceRunning 执行 binderMusicInterface.playMusic() ");
//
//                            switch (_playType) {
//
//                                case PLAYMUSIC_BY_LINKONLINE: {//播放在线的mp3文件内容
//
//                                    //判断是否是离线消息。如果是离线的，那么就重启service
//                                    //如果服务活着的直接执行 内部方法
//                                    if (binderMusicInterface != null) {
//
////                                        LogUtils.d("itchen----> binderMusicInterface 不是空的，执行播放在线音乐链接， binderMusicInterface.playMusicByLinkOnLine() ");
//                                        binderMusicInterface.playMusicByLinkOnLine(_isUrlSoundFlag, _soundUrl, _soundFileName);
//
//                                    }
//
//                                    break;
//                                }
//
//                                case PLAYMUSIC_BY_GIVENFILENAME: {//播放指定的文件名的 mp3文件名的 文件。
//
//                                    if (binderMusicInterface != null) {
//
////                                        LogUtils.d("itchen----> binderMusicInterface 不是空的，执行播放 指定的音乐 本地的， binderMusicInterface.playMusicByGivenFileName() ");
//
//                                        //2021年10月27日14:07:28。 发现_soundFileName有可能是空的。
//                                        binderMusicInterface.playMusicByGivenFileName(_soundFileName);
//
//                                    }
//
//                                    break;
//                                }
//
//                                case PLAYMUSIC_BY_DEFAULT: {//播放本地默认的声音文件
//
//                                    if (binderMusicInterface != null) {
//
////                                        LogUtils.d("itchen----> binderMusicInterface 不是空的，执行播放 本地默认的 音频文件。");
//
//                                        //2021年10月27日14:07:28。 发现_soundFileName有可能是空的。
//                                        binderMusicInterface.playMusicByDefaultFile();
//
//                                    }
//
//                                    break;
//                                }
//
//                                default:
//                                    break;
//                            }
//
//
//                        } else {
//
////                            LogUtils.d("itchen----> 服务是  死的  执行 startService 重新播放 ");
//
//                            //不然，就重启 这个服务，还是会再次播放的
//                            //消息推送已经来了，我播放一遍
//                            //判断是否锁屏，锁屏就播放我自己的。
//                            methodStartService(_context, _isUrlSoundFlag, _soundUrl, _soundFileName);
//
//                        }
//
//                        //=====================================================================================================================
//
//                    }
//                });
//
//        //===========================================================================================================================================
//
//    }


    /**
     * 手动启动service的通用方法
     */
//    private static void methodStartService(Context _context, String _isUrlSoundFlag, String _soundUrl, String _soundFileNameWithNoSuffix) {
//
//        Intent intentStartService = new Intent();
//        intentStartService.setClass(_context, MusicPlayService.class);
//
//        //标志是从推送控制过来的
//        intentStartService.putExtra(ConstantApi.EXTRA_KEY_FROM_WHICH_TYPE, ConstantApi.STARTSERVICE_ACTIONFLAG);
//
//        //携带播放的链接内容，
//        intentStartService.putExtra(ConstantApi.EXTRA_KEY_ISURLSOUNDFLAG, _isUrlSoundFlag);
//        intentStartService.putExtra(ConstantApi.EXTRA_KEY_SOUNDURL, _soundUrl);
//        intentStartService.putExtra(ConstantApi.EXTRA_KEY_SOUNDFILENAMEWITHNOSUFFIX, _soundFileNameWithNoSuffix);
//
////        LogUtils.d("itchen---MusicPlayService--服务是 活着的，那么 再次打开");
//
//        //如果 设备保养的服务 没有起来，那么就起来
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//
//            if (_context != null) {
//                _context.startForegroundService(intentStartService);
//            }
//
//        } else {
//            ServiceUtils.startService(intentStartService);
//        }
//
//    }

//    private void methodToPush(Context mContext, Map<String, String> mapExtra) {
//
//        //绑定携带
//        //判断是在前台 还是在后台
//        //boolean isAppForeground = AppUtils.isAppForeground();
//        //LogUtils.d("itchen--应用是否前台：" + isAppForeground);
//
//        if (TextUtils.equals(mapExtra.get("open"), "MY_MESSAGE")) {
//
//            //如果是点击查看消息列表,那么直接跳转到首页，然后走到 第二个选项卡的。
//            Session.get(mContext).setPushToMyMessage(true);
//            //这里暂时用不到强制退出消息列表，因为消息是在首页的
//            //session.setPushToMyMessageProce(true);
//
//            if (AppUtils.isAppForeground()) {//如果是前台运行那么，直接跳转页面。
//
//                //什么前置条件操作？
//                //携带参数内容
//                Intent intentToMessage = new Intent();
//                //跳转到【首页】并且跳转到【我的消息】。
//                intentToMessage.setClass(mContext, HomeMainFragmentActivity.class);
//
//                intentToMessage.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//必须携带吗？
//
//                //携带一个跳转到消息选项卡的标识
//                intentToMessage.putExtra(ConstantApi.EXTRA_LOGINKEY, ConstantApi.EXTRA_PUSHTOBULLETIN);
//
//                mContext.startActivity(intentToMessage);
//
//            } else {//如果是后台运行，那么重启app即可
//
//                method_toSplash(mContext);//启动app-->进而启动消息内容
//
//            }
//
//        } else if (TextUtils.equals(mapExtra.get("open"), "NOTICE_IS_PUSH")) {//如果收到的是 社区公告
//
//
//            //直接跳转到社区公告详情?还是公告列表?
//            //LogUtils.d("itchen--->直接收到了公告的推送消息");
//            Session.get(mContext).setPushToBulletinWebview(true);
//            Session.get(mContext).setPushToBulletinWebviewProce(true);
//
//            if (AppUtils.isAppForeground()) {
//
//                //携带参数内容,携带友盟
//                Intent intentToMessage = new Intent();
//                intentToMessage.setClass(mContext, WebViewNormalActivity.class);
//                intentToMessage.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//必须携带吗？
//
//                intentToMessage.putExtra(ConstantApi.EXTRA_CATEGORY_NAME, "消息详情");
//                intentToMessage.putExtra(ConstantApi.EXTRA_WEBVIEW_FLAG, ConstantApi.WEBVIEWFLAG_BULLETIN);
//                intentToMessage.putExtra(ConstantApi.EXTRA_WEBVIEW_NOTICEID, mapExtra.get("noticeId"));
//
//                //ActivityUtils.startActivity(extras, WebViewNormalActivity.class);
//                mContext.startActivity(intentToMessage);
//
//            } else {//如果是后台运行，那么重启app即可
//
//                method_toSplash(mContext);//启动app-->进而启动消息内容
//
//            }
//
//        }
//
//    }

    /**
     * 携带有http的内容,这个是比较全面的
     */
//    public static void methodInitThridSDKWithHTTP(Context _context) {
//
//        //这种事初始化 androidutilscode 和 http的内容；
//        if (_context != null) {
//
//            //初始化blankj
//            Utils.init((Application) _context);
//
//            initLog(ApiService.IS_DEBUG);
//
//            //initX5CoreNomal();
//            //---------------------------------------------------------------------------------
//            //初始化友盟的消息
//            UMConfigure.submitPolicyGrantResult(_context, true);
//            //推送平台多维度推送决策必须调用方法（需要同意隐私政策之后初始化完成调用）
//            PushAgent.getInstance(_context).onAppStart();
//            //初始化友盟消息推送的内容
//            initUmengPushSDK(_context, ApiService.IS_DEBUG);
//            //---------------------------------------------------------------------------------
//            //初始化崩溃的处理或者日志观察
//            if (ApiService.IS_DEBUG) {
//                initCrash(_context);
//            } else {
//                initTenBugly(_context, ApiService.IS_DEBUG);
//            }
//
//            Album.initialize(//
//                    AlbumConfig.newBuilder(_context)//
//                            .setAlbumLoader(new MediaLoader())//
//                            .setLocale(Locale.getDefault())//
//                            .build());//
//
//            //第一种方式
//            LiuAnUtils.init(_context);
//
//            //仅仅是配置workManager
////        Configuration myConfig = new Configuration.Builder()
////                .setMinimumLoggingLevel(android.util.Log.VERBOSE)
////                .build();
////        WorkManager.initialize(getBaseContext(), myConfig);
//            //========================================================================================================================
//            //========================================================================================================================
//            //初始化用户登录信息的数据库
//            LoginInfoDaoManager.getInstance().init(_context);
//            //初始化 离线工单 暂存任务的数据库
//            WorkerOffLineInfoDaoManager.getInstance().init(_context);
//            //初始化 获取社区信息的 数据库内容
//            CommunityDaoManager.getInstance().init(_context);
//            //============================================================================
//
//        }
//
//    }

//    public static void methodInitThridSDKNoHTTP(Context _context) {
//
//        //这种事初始化: androidutilscode 和 http的内容；
//        if (_context != null) {
//
//            //初始化blankj
//            //com.blankj.utilcode.util.Utils.init((Application) _context);
//
//            initLog(ApiService.IS_DEBUG);
//
//            //initX5CoreNomal();
//            //---------------------------------------------------------------------------------
//            //初始化友盟的消息
//            //原始代码是：UMConfigure.submitPolicyGrantResult(getApplicationContext(), true);
//            UMConfigure.submitPolicyGrantResult(_context, true);
//
//            //推送平台多维度推送决策必须调用方法（需要同意隐私政策之后初始化完成调用）
//            //初始化友盟消息推送的内容
//            initUmengPushSDK(_context, ApiService.IS_DEBUG);
//            PushAgent.getInstance(_context).onAppStart();
//
//            //---------------------------------------------------------------------------------
//            //初始化崩溃的处理或者日志观察
//            if (false) {
//                initCrash(_context);
//            } else {
//                initTenBugly(_context, ApiService.IS_DEBUG);
//            }
//
//            Album.initialize(//
//                    AlbumConfig.newBuilder(_context)//
//                            .setAlbumLoader(new MediaLoader())//
//                            .setLocale(Locale.getDefault())//
//                            .build());//
//
//            //第一种方式
//            LiuAnUtils.init(_context);
//
//            //仅仅是配置workManager
//            //Configuration myConfig = new Configuration.Builder()
//            //        .setMinimumLoggingLevel(android.util.Log.VERBOSE)
//            //        .build();
//            //WorkManager.initialize(getBaseContext(), myConfig);
//            //===========================================================================
//            //===========================================================================
//            //初始化用户登录信息的数据库
//            LoginInfoDaoManager.getInstance().init(_context);
//
//            //初始化 离线工单 暂存任务的数据库
//            WorkerOffLineInfoDaoManager.getInstance().init(_context);
//
//            //初始化 获取社区信息的 数据库内容
//            CommunityDaoManager.getInstance().init(_context);
//            //============================================================================
//
//        }
//
//    }

//    private static void initTenBugly(Context context, boolean _isDebug) {
//
////        //为了提高合作方的webview场景稳定性，及时发现并解决x5相关问题，当客户端发生crash等异常情况并上报给服务器时请务必带上x5内核相关信息
////        // 。x5内核异常信息获取接口为：com.tencent.smtt.sdk.WebView.getCrashExtraMessage(context)。以bugly日志上报为例：
////        CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(this.getApplicationContext());
////        strategy.setCrashHandleCallback(new CrashReport.CrashHandleCallback() {
////            public Map<String, String> onCrashHandleStart(
////                    int crashType,
////                    String errorType,
////                    String errorMessage,
////                    String errorStack) {
////
////                LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
////                String x5CrashInfo = com.tencent.smtt.sdk.WebView.getCrashExtraMessage(_instance);
////                map.put("x5crashInfo", x5CrashInfo);
////                return map;
////            }
////
////            @Override
////            public byte[] onCrashHandleStart2GetExtraDatas(
////                    int crashType,
////                    String errorType,
////                    String errorMessage,
////                    String errorStack) {
////                try {
////                    return "Extra data.".getBytes(StandardCharsets.UTF_8);
////                } catch (Exception e) {
////
////                    return null;
////                }
////            }
////        });
//        //========================================================================================================================
//
//        CrashReport.initCrashReport(context, "665a045048", _isDebug);//真实的智慧物业管家物业员工端的key_id
//
//        //========================================================================================================================
//
//
//    }


//    /**
//     * 初始化kalle的配置
//     */
//    //public static void kalleConfigInit(Context _context, Session _session) {//这里session是多余的
//    public static void kalleConfigInit(Context _context) {
//
//        KalleConfig config = KalleConfig.newBuilder()
//                //.setHeader("Accept-Encoding", "identity")
//                .setHeader("Connection", "close")//2021-7-17 10:33:18 为了测试unexpected end of stream问题而修改。
//                //Connection
//                //.addHeader(ConstantApi.USERTOKEN, _session.getToken())//userToken  假如首次安装是null
//                .addHeader(ConstantApi.USERTOKEN, MMKV.defaultMMKV().decodeString(ConstantApi.P_TOKEN))//userToken  假如首次安装是null
//                .addHeader(ConstantApi.DEVICECODE, MMKV.defaultMMKV().decodeString(ConstantApi.P_UUID_UNIQUEDEVICEID_ANDROIDID))//deviceCode 假如首次安装是nul
//                .connectFactory(OkHttpConnectFactory.newBuilder().build())
//                .cookieStore(DBCookieStore.newBuilder(_context).build())
//                //.cacheStore(DiskCacheStore.newBuilder(AppConfig.get().PATH_APP_CACHE).build())
//                .network(new BroadcastNetwork(_context))//这个建议添加上
//                .addInterceptor(new RetryInterceptor(1))//重试 1 次数的拦截器,2021-7-17 10:11:33 超频率 不重试
//                .connectionTimeout(60, TimeUnit.SECONDS)//网络连接时间默认60秒
//                .readTimeout(60, TimeUnit.SECONDS)//
//                //.workThreadExecutor(Executor)
//                //.addInterceptor(new LoggerInterceptor ("itchen--KalleSample", isDebug))
//                //.converter(new JsonConverter(this))//配置全局的转换器
//                .build();
//
//        //interceptor.setLevel(HttpLoggingInterceptor.Level.NONE);
//
//        //而且再gettoken之中也要加前缀 communitySteward_
//        //形式如：GET http://wuyeapi.91dgj.com//pub/v1/token/getToken/communitySteward_4385c2b7089fbcd1 HTTP/1.1
//        //本来原始的User-Agent是User-Agent: Mozilla/5.0 (Linux; U; Android 9; en; DUK-AL20 Api/HUAWEIDUK-AL20) AppleWebKit/534.30 (KHTML, like Gecko) Version/5.0 Mobile Safari/534.30
//        //User-Agent: CommunitySteward/Mozilla/5.0 (Linux; U; Android 9; zh-cn; DUK-AL20 Build/HUAWEIDUK-AL20) AppleWebKit/533.1 (KHTML, like Gecko) Version/5.0 Mobile Safari/533.1
//
//        //原始的：User-Agent
//        List<String> userAgentOriginalList = config.getHeaders().get("User-Agent");
//        config.getHeaders().remove("User-Agent");//得把早期原始的清除掉
//
//        //LogUtils.d("itchen--->userAgentOriginalList="+userAgentOriginalList);
//        //itchen--->userAgentOriginal=[Mozilla/5.0 (Linux; U; Android 9; en; DUK-AL20 Api/HUAWEIDUK-AL20) AppleWebKit/534.30 (KHTML, like Gecko) Version/5.0 Mobile Safari/534.30]
//
//        //userAgentOriginal.add(0,"17531108969/");
//        //LogUtils.d("itchen--->userAgentLast="+userAgentOriginal);
//        //itchen--->userAgentLast=[17531108969/, Mozilla/5.0 (Linux; U; Android 9; en; DUK-AL20 Api/HUAWEIDUK-AL20) AppleWebKit/534.30 (KHTML, like Gecko) Version/5.0 Mobile Safari/534.30]
//
//        if (userAgentOriginalList != null && !userAgentOriginalList.isEmpty()) {
//            String temp = "CloudSteward/" + userAgentOriginalList.get(0);
//            userAgentOriginalList.set(0, temp);
//        }
//
//        //LogUtils.d("itchen--->userAgentLast="+userAgentOriginalList);
//        //itchen--->userAgentLast=[17531108969/Mozilla/5.0 (Linux; U; Android 9; en; DUK-AL20 Api/HUAWEIDUK-AL20) AppleWebKit/534.30 (KHTML, like Gecko) Version/5.0 Mobile Safari/534.30]
//
//        config.getHeaders().add("User-Agent", userAgentOriginalList);
//
//        //config.getHeaders().remove("Connection");
//        //config.getHeaders().add("Connection", "close");
//        //config.getHeaders().set("Accept-Encoding", "identity");
//
//        Kalle.setConfig(config);
//
//        //---------------------------------------------
//
//    }

//    /**
//     * 初始化推送SDK，在用户隐私政策协议同意后，再做初始化
//     */
//    public static void initUmengPushSDK(Context _context, boolean _isDebug) {
//        /*
//         * 判断用户是否已同意隐私政策
//         * 当同意时，直接进行初始化；
//         * 当未同意时，待用户同意后，通过 PushHelper.init(...) 方法进行初始化。
//         */
//        boolean agreed = MMKV.defaultMMKV().decodeBool(ConstantApi.P_SECRECYTURL_AGREE);
//
//        if (agreed && PushHelper.isMainProcess(_context)) {
//
//            //设置LOG开关，true 就是打开测试开关，默认为 false 不打开测试开关
//            /**
//             * 注意: 即使您已经在 AndroidManifest.xml 中配置过appkey和channel值，也需要在App代码中调
//             * 用初始化接口（如需要使用AndroidManifest.xml中配置好的appkey和channel值，
//             * UMConfigure.init调用中appkey和channel参数请置为null）。
//             * * 注意：如果您已经在AndroidManifest.xml中配置过appkey和channel值，可以调用此版本初始化函数。
//             */
//            //日志开关
//            UMConfigure.setLogEnabled(_isDebug);
//            //预初始化
//            PushHelper.preInit(_context);
//
//            //UMConfigure.UMinit(getApplicationContext());
//
//            //启动服务,播放友盟推送声音的；
//            //2022年5月31日 bug 发现这里启动服务会造成：[android.app.RemoteServiceException: Context.startForegroundService() did]的bug;
//            //PushHelper.startServiceWithNoBundle(getApplicationContext());
//
//            //建议在线程中执行初始化
//            new Thread(new Runnable() {
//                @Override
//                public void run() {
//                    PushHelper.init(_context);
//                }
//            }).start();
//
//
//        } else {
//            //若不是主进程（":channel"结尾的进程），直接初始化sdk，不可在子线程中执行
//            if (agreed) {
//                //若不是主进程（":channel"结尾的进程），直接初始化sdk，不可在子线程中执行
//                PushHelper.init(_context);
//
//            } else {
////                LogUtils.d(ConstantApi.LOGCAT_NOMAL + "用户还没有点击【同意】还不能从友盟这里获取-deviceToken");
//            }
//        }
//    }
    public static void initLog(boolean _isDebug) {

        //final com.blankj.utilcode.util.LogUtils.Config config = com.blankj.utilcode.util.LogUtils.getConfig()
        com.blankj.utilcode.util.LogUtils.getConfig()
                .setLogSwitch(_isDebug)// 设置 log 总开关，包括输出到控制台和文件，默认开
                .setConsoleSwitch(_isDebug)// 设置是否输出到控制台开关，默认开
                .setGlobalTag("itchen")// 设置 log 全局标签，默认为空
                // 当全局标签不为空时，我们输出的 log 全部为该 tag，
                // 为空时，如果传入的 tag 为空那就显示类名，否则显示 tag
                .setLogHeadSwitch(_isDebug)// 设置 log 头信息开关，默认为开
                .setLog2FileSwitch(true)// 打印 log 时是否存到文件的开关，默认关
                .setSingleTagSwitch(true)// 一条日志仅输出一条，默认开，为美化 AS 3.1 的 Logcat
                .setDir("")// 当自定义路径为空时，写入应用的/cache/log/目录中
                .setFilePrefix("itchen")// 当文件前缀为空时，默认为"util"，即写入文件为"util-MM-dd.txt"
                .setBorderSwitch(false)// 输出日志是否带边框开关，默认开
                .setConsoleFilter(com.blankj.utilcode.util.LogUtils.V)// log 的控制台过滤器，和 logcat 过滤器同理，默认 Verbose ：itchen 仅仅打印普通的日志
                .setFileFilter(com.blankj.utilcode.util.LogUtils.V)// log 文件过滤器，和 logcat 过滤器同理，默认 Verbose：itchen仅仅记录报错的日志
                .setStackDeep(1)// log 栈深度，默认为 1
                .setSaveDays(100);//  设置日志可保留天数，默认为 -1 表示无限时长

    }


//    private void initX5CoreService(Context _context) {
//
//        try {
//            //一些会抛出异常的代码
//            Intent intent = new Intent(_context, X5CorePreLoadService.class);
//            _context.startService(intent);
//
//        } catch (Exception e) {
//            //处理该异常的代码块
//            e.printStackTrace();
//        }
//
//    }

    /**
     * 正常的启动该app即可
     */
//    private void method_toSplash(Context context) {
//
//        Intent intentTosplash = new Intent();
//
//        intentTosplash.setClass(context, SplashActivity.class);
//        intentTosplash.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//
//        //LogUtils.d("itchen--->执行到-->method_toSplash");
//        context.startActivity(intentTosplash);
//
//    }
//    public static void initCrash(Context _context) {
//
//        //我自己做测试的crash
//        final CrashHandler myCrashHandler = CrashHandler.getInstance();
//        myCrashHandler.init(_context);
//        Thread.currentThread().setUncaughtExceptionHandler(myCrashHandler);
//
////        CrashUtils.init(new CrashUtils.OnCrashListener() {
////            @Override
////            public void onCrash(String crashInfo, Throwable e) {
////                //调试模式直接打印
////                if (isDebug){
////                    //LogUtils.e("itchen",crashInfo);
////                }else{
////                    //这个已经过滤是要保存在本地的
////                    //LogUtils.e(crashInfo);
////                }
////                //正式发包
////                //LogUtils.e(crashInfo);
////                //一旦发现splash崩溃之后，就一直在重启，很诡异。
////                //AppUtils.relaunchApp();
////            }
////        });
//
//    }

    //private static final String TAG = "MyApplication";
    /*@RequiresApi(api = 28)
    public void webviewSetPath(Context context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            String processName = getProcessName(context);
            if (!getApplicationContext().getPackageName().equals(processName)) {//判断不等于默认进程名称
                WebView.setDataDirectorySuffix(processName);
            }
        }
    }

    public String getProcessName(Context context) {
        if (context == null) return null;
        ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
            if (processInfo.pid == android.os.Process.myPid()) {
                return processInfo.processName;
            }
        }
        return null;
    }*/


//    private void initUmengSDK() {
//        //正式初始化
//        initPushSDK();
//    }

    //不在这里初始化， 因为这个不是十分重要
    /*private void initBaiduMapSDK() {

        //这里也有一个隐私协议的判定,首次时候，这里肯定是false,
        boolean agreed_baidu_status = SPUtils.getInstance().getBoolean(ConstantApi.P_CLICK_BAIDU_PRIVACY_AGREEMENT);

        //--------------------------------------------------------------------------------------------
        //定位类的隐私合规：
        LocationClient.setAgreePrivacy(agreed_baidu_status);

        //地图类的隐私合规：
        SDKInitializer.setAgreePrivacy(getApplicationContext(), agreed_baidu_status);

        //新版本的不在这里初始化；
        //locationService = new LocationService(getApplicationContext());
        //mVibrator = (Vibrator) getApplicationContext().getSystemService(Service.VIBRATOR_SERVICE);

        try {

            //do
            // 在使用 SDK 各组间之前初始化 context 信息，传入 ApplicationContext
            // 默认本地个性化地图初始化方法
            SDKInitializer.initialize(this.getApplicationContext());
            //自4.3.0起，百度地图SDK所有接口均支持百度坐标和国测局坐标，用此方法设置您使用的坐标类型.
            //包括BD09LL和GCJ02两种坐标，默认是BD09LL坐标。
            SDKInitializer.setCoordType(CoordType.BD09LL);

        } catch (BaiduMapSDKException e) {

            //catch
            e.printStackTrace();

            //这里其实可以上传日志信息；

        }
        //--------------------------------------------------------------------------------------------
    }*/

    /*public LocationService getLocationService() {
        return locationService;
    }*/

    /**
     * 初始化蒲公英SDK
     * @param application
     */
//    private static void initPgyerSDK(PropertyApplication application) {
//        new PgyerSDKManager.Init()
//                .setContext(application) //设置上下问对象
//                .start();
//    }

    /*public void setLocationService(LocationService _locationService) {
        this.locationService = _locationService;
    }*/

    /*{
        "appkey": "5dfdcd6c570df3ca2d00002a",
            "description": "测试第一个消息推送",
            "device_tokens": "AubQJUKXZIkoXADMDqhFE6e2ZBx0I4d6APAFP-Uauyq8",
            "payload": {
        "body": {
            "after_open": "go_app",
                    "play_lights": "false",
                    "play_sound": "true",
                    "play_vibrate": "false",
                    "text": "管家物业测试内容",
                    "ticker": "测试第一个消息推送",
                    "title": "测试第一个消息推送"
        },
        "display_type": "notification"
    },
        "policy": {
        "expire_time": "2021-02-08 17:28:49"
    },
        "production_mode": false,
            "timestamp": "1612517491440",
            "type": "unicast"
    }*/

}
